--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/frontend/LinkUtils.test.js 059d2cbdc100fcb9dd6f7749056a8ca676ab3eba (059d2cbd) Text, 5.32 KB
Tff7b72import Tb4b4b4{ Te6edf3describeTb4b4b4, Te6edf3itTb4b4b4, Te6edf3expect Tb4b4b4} Tff7b72from Ta5d6ff"vitest"Tb4b4b4;
Tff7b72import Te6edf3LinkUtils Tff7b72from Ta5d6ff"@/js/LinkUtils"Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"LinkUtils.js"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3describeTb4b4b4(Ta5d6ff"renderReticulumLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet:// links with hash and path"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet://1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects nomadnet@ links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"nomadnet@1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects bare hash and path links as nomadnet"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="nomadnet-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects bare hash as lxmf"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf:// links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"lxmf://1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects lxmf@ links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"lxmf@1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'class="lxmf-link'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-lxmf-address="1dfeb0d794963579bd21ac8f153c77a4"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"renderStandardLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects http links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"visit http://example.com"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'<a href="http://example.com"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"detects https links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"visit https://example.com/path?query=1"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'<a href="https://example.com/path?query=1"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"renderAllLinks"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"detects both types of links"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"Check https://google.com and nomadnet://1dfeb0d794963579bd21ac8f153c77a4"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://google.com"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'data-nomadnet-url="1dfeb0d794963579bd21ac8f153c77a4:/page/index.mu"'Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns empty string for empty input"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"returns string with no links for plain text"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Ta5d6ff"Just some words."Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"Just some words."Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff"<a "Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3describeTb4b4b4(Ta5d6ff"risky: no script or data URLs in href"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3itTb4b4b4(Ta5d6ff"does not produce javascript: href for text containing javascript: URL"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"see javascript:alert(1) here"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/\bhref\s*=\s*["']?\s*javascript:/iTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"does not produce data: href for text containing data: URL"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"see data:text/html,<script>x</script> here"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/\bhref\s*=\s*["']?\s*data\s*:/iTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"stops URL at space so no script in same line"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3text Tff7b72= Ta5d6ff"https://example.com javascript:alert(1)"Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3toContainTb4b4b4(Ta5d6ff'href="https://example.com"'Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3resultTb4b4b4)Tb4b4b4.Te6edf3notTb4b4b4.Te6edf3toMatchTb4b4b4(Ta5d6ff/href="[^"]*javascript:/Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles null and undefined without throwing"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderReticulumLinksTb4b4b4(Tff7b72undefinedTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Te6edf3LinkUtilsTb4b4b4.Te6edf3renderStandardLinksTb4b4b4(Tff7b72nullTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toBeTb4b4b4(Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Te6edf3itTb4b4b4(Ta5d6ff"handles very long input without hanging"Tb4b4b4, Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Tff7b72long Tff7b72= Ta5d6ff"a"Tb4b4b4.Te6edf3repeatTb4b4b4(T79c0ff100000Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3start Tff7b72= Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3LinkUtilsTb4b4b4.Te6edf3renderAllLinksTb4b4b4(Tff7b72longTb4b4b4)Tb4b4b4;
Te6edf3expectTb4b4b4(Tffa657DateTb4b4b4.Te6edf3nowTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3startTb4b4b4)Tb4b4b4.Te6edf3toBeLessThanTb4b4b4(T79c0ff200Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────